home *** CD-ROM | disk | FTP | other *** search
Text File | 1995-01-14 | 94.9 KB | 2,713 lines | [TEXT/????] |
- %% RLaB Primer
- %
- %% This file documents RLaB, a Vector and Matrix Programming Language
- %% Copyright @copyright{} 1992, 1993, 1994 Ian R. Searle
- %%
- %% Permission is granted to make and distribute verbatim copies of
- %% this manual provided the copyright notice and this permission notice
- %% are preserved on all copies.
- %%
- %% Permission is granted to process this file through TeX and print the
- %% results, provided the printed document carries a copying permission
- %% notice identical to this one except for the removal of this paragraph
- %% (this paragraph not being relevant to the printed manual).
- %%
- %% Permission is granted to copy and distribute modified versions of this
- %% manual under the conditions for verbatim copying, provided also that the
- %% sections entitled ``Distribution'' and ``General Public License'' are
- %% included exactly as in the original, and provided that the entire
- %% resulting derived work is distributed under the terms of a permission
- %% notice identical to this one.
- %%
- %% Permission is granted to copy and distribute translations of this manual
- %% into another language, under the above conditions for modified versions,
- %% except that the sections entitled ``Distribution'' and ``General Public
- %% License'' may be included in a translation approved by the author instead
- %% of in the original English.
- %
- % This document copyright
- % Ian R. Searle
- % ians@eskimo.com
- % and
- % Phillip Musumeci, Electrical Engineering Department,
- % University College, Australian Defence Force Academy,
- % Canberra A.C.T. 2600, AUSTRALIA.
- %
- %% For permissions relating to reproduction of this document,
- %% see PERMISSIONS below.
- %%
- %% For corrections and suggestions relating to this document,
- %% see SUGGESTIONS below.
- %
-
- \documentstyle[11pt]{article}
-
- \newcommand{\defined}{\buildrel {\triangle}\over =}
- \newcommand{\dfn}{\buildrel {\triangle}\over =}
- \newcommand{\tends}{\mbox{$\rightarrow$}}
- \newcommand{\half}{\mbox{${1 \over 2}$}}
-
- %\typeout{RLaB primer v0.1 phillip@ee.adfa.oz.au 22/1/93}
-
- \addtolength{\topmargin}{-1.9cm} % shrink LaTeX's huge margins
- \addtolength{\textwidth}{4cm}
- \setlength{\textheight}{22.2cm}
- \setlength{\parindent}{0in}
- \addtolength{\oddsidemargin}{-1.9cm}
- \addtolength{\evensidemargin}{-1.9cm}
- \setlength{\parskip}{0.25cm}
-
- %%
- %% Define RLaB logos. They are all the same
- %%
- \def\RLAB{{\rm R\kern-.16em\lower.5ex\hbox{L}\kern-.25em\raise.3ex
- \hbox{a}\kern-.1emB}\,}
- \def\RLaB{{\rm R\kern-.16em\lower.5ex\hbox{L}\kern-.25em\raise.3ex
- \hbox{a}\kern-.1emB}\,}
- \def\Rlab{{\rm R\kern-.16em\lower.5ex\hbox{L}\kern-.25em\raise.3ex
- \hbox{a}\kern-.1emB}\,}
- \def\rlab{{\rm R\kern-.16em\lower.5ex\hbox{L}\kern-.25em\raise.3ex
- \hbox{a}\kern-.1emB}\,}
-
- \begin{document}
-
- \begin{titlepage}
-
- \begin{center}
- {\Huge \rlab\ Primer \\}
- {\Large Version 1.0}
-
- \vskip 1cm
- {\Large Ian R. Searle \& Phillip Musumeci}
- \end{center}
-
- \vskip 3cm
-
- \begin{figure}[h]
- \begin{picture}(350,300)(0,50) % (x-size, y-size) (x-shift, y-shift)
- \special{psfile=logo.ps
- angle=90 hscale=120 vscale=120 voffset=-100 hoffset=700}
- \end{picture}
- \end{figure}
-
- \vskip 1cm
-
- \begin{center}
- The \RLaB\ program is \copyright copyright 1993, 94 Ian R. Searle.\\ This
- document is \copyright copyright 1993, 94 Ian R. Searle \& Phillip Musumeci.
- \end{center}
-
- \end{titlepage}
- \newpage
- \tableofcontents
- \newpage
- \listoffigures
- \newpage
-
- \setcounter{section}{-1}
- %\setcounter{page}{35}
-
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \section{Primer priming}
-
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \subsection{\RLaB\ is freely available}
-
- \RLaB\ stands for Our-Lab, since it is intended to be a freely available
- program that anyone can use, and contribute to. To protect this freedom,
- copying of the program is protected by the GNU General Public License.
-
- The main ftp site is \verb+evans.ee.adfa.oz.au+. The directory
- \verb+pub/RLaB+ contains the sources and binary versions for some
- machines. On the North American continent \verb+csi.jpl.nasa.gov+
- acts as an archive site for \rlab, look in \verb+pub/matlab/RLaB+.
-
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \subsection{Acknowledgments}
-
- The availability of ``free'' software, such as GNU Emacs, GNU gcc,
- gdb, gnuplot, Plplot, and the Netlib archives has made this project
- possible. The \RLaB\ author thanks both the authors and sponsors of
- the GNU, LAPACK, RANLIB, FFTPACK, and Plplot projects.
-
- Many individuals have contributed to \rlab\ in various ways. A list of
- contributors can be found in the source distribution file
- \verb+ACKNOWLEDGMENT+. A special thanks to Phillip Musumeci and
- Matthew Wette who have provided FTP sites so that \rlab\ is available
- to all.
-
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \subsection{Document reproduction and errors}
-
- %% PERMISSIONS
-
- The \RLaB\ Primer is freely available. Permission is granted to reproduce
- the document in any way providing that it is distributed for free, except
- for any reasonable charges for printing, distribution, staff time, etc.
- Direct commercial exploitation is not permitted. Extracts may be made from
- this document providing an acknowledgment of the original \LaTeX\ source is
- maintained.
-
- %% SUGGESTIONS
-
- We welcome reports of errors and suggestions for improvement in this
- document and also in \Rlab. Please mail these to {\tt
- rlab-list@eskimo.com}. Unfortunately (for you), free software does not earn
- quite enough to pay a bribe for each error-free error report received but
- do feel free to email them.
-
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \subsection{Requirements}
-
- \RLaB\ is written in C. The maths libraries used are written in
- Fortran but the use of a publicly available Fortran$\rightarrow$C
- converter reduces compiler requirements to C (the conversion tool f2c
- is written in C). The library used for data display, PLPLOT, is
- publicly available in C source code form for a wide variety of
- platforms. This makes the whole \RLaB\ package a good candidate for
- porting onto platforms with C, especially GNU C.
-
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \subsection{How to Read This Primer}
-
- This primer has intentionally been kept short, so you should be able
- to read all of it without too much effort. Probably the best way to
- read this primer is to do so sitting at a computer, trying the
- examples as you encounter them.
-
-
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \section{Introduction} \label{sect-intro}
-
- \RLaB\ brings the power of stable matrix maths tools plus a stable data
- plotting facility together in a form that is freely available and ready to
- be compiled and used on a variety of common computer systems. \RLaB\ allows
- you to experiment with complex matrix maths in an interactive environment.
- Because you enter commands at a high (mathematical) level, you can
- concentrate on figuring out your solution and hopefully avoid becoming
- bogged down in low level implementation details. By minimising the effort
- required to implement algorithms, it is hoped that you will be more willing
- to discard old programs when confronted by better algorithms that warrant
- use.
-
- \RLaB\ uses a structured language\footnote{These days, computer
- languages do look very similar but we will try to point out a few {\em
- useful} similarities!} which will be familiar to users of C and also
- the Wirth-inspired languages such as Pascal and Modula. An \RLaB\
- program is a file containing a sequence of commands or instructions
- that you could also enter from your terminal---these instructions
- might perform a calculation and assign the result to a variable, or
- call a function which returns a result which you display on your
- terminal, and so on. Functions can be either built-in or user-defined.
- In fact, the only form of ``subprogram'' in \RLaB\ is the function
- and, just like in C, a function returns a single item as its answer.
- Data storage declared in the main routine of your program is stored on
- a global symbol table, and is available to all of your subprogram
- functions. By default, data used within functions is local to the
- function. Such local function storage exists only for the duration of
- the function call, in a way similar to variables declared locally
- within Pascal procedures. Comments can be appended to any line in
- your program by using a special symbol at the start of the
- comment---this is similar to Fortran and C++, and avoids the possible
- pitfall of ``run away'' comments which might be familiar to Pascal
- users. Overall, the language syntax is perhaps closest to C but if
- you have ever programmed in C or Pascal, you will soon be at ease with
- \RLaB.
-
- \RLaB\ features strongly typed objects but with the emphasis on
- usefulness, not on pedantics. In \RLaB\, we talk about the {\em class}
- of an object and the available classes include numeric, string,
- function, and list. The first class of object, {\em numeric},
- encompasses numeric scalars, vectors, and matrices, and should be
- familiar to the matrix maths user. The remaining classes borrow
- concepts, and implementation details from other languages such as C.
-
- It is worth noting that a function can be thought of as just another
- object---this means that when you come to write your own functions
- that use input parameters, you will enjoy the flexibility of being
- able to pass in other functions as well as data as input to your
- function. Another feature of functions as implemented in \RLaB\ is
- that they can call themselves---anyone who has written a program to
- calculate factorials will appreciate the elegance that recursion can
- bring to some programming solutions.
-
- Having whetted your appetite, this primer aims to get you started with
- \RLaB\ as both an interactive tool and as a programming language. The
- ideal approach is for you to read (or re-read) this document with an
- \RLaB\ session staring up at you. After showing you how to run \RLaB\
- and get on-line help, we describe data types before moving back to a
- ``hands on'' description of basic operations. Program structure is
- then described and you will see how to write your own functions. As
- \RLaB\ comes with quite a few handy functions already built-in, we
- give examples of their use including the plot function at which point
- we hope you will be able to start using \RLaB\ to develop your own
- programs.
-
- % and you will find the quick reference tables in the appendices most
- % useful.
-
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
- \section{Starting to use \RLaB}
-
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
- \subsection{How to run it}
-
- A properly installed \RLaB\ can be started on your terminal by entering
-
- \begin{verbatim}
- $ rlab
- \end{verbatim}
-
- where typewriter-style dark text is meant to represent the text you
- would see sitting in front of a display terminal. The first character
- on the input line is always the prompt, in this case a Bourne-shell
- prompt. The text following is what the user enters. Text echoed by a
- program is not preceded by any prompt.
-
- \RLaB\ will start with a message similar to:
-
- \begin{verbatim}
- Welcome to RLaB. New users type `help INTRO'
- RLaB version 1.0 Copyright (C) 1992, 93, 94 Ian Searle
- RLaB comes with ABSOLUTELY NO WARRANTY; for details type `help WARRANTY'
- This is free software, and you are welcome to redistribute it under
- certain conditions; type `help CONDITIONS' for details
- >
- \end{verbatim}
-
- The \verb+>+ symbol on the last line next to the cursor is the \RLaB\
- command prompt. At this point, users should take the advice offered and
- be usefully distracted from this primer by {\em actually reading} the
- information available from {\tt help INTRO} - do not worry if you cannot
- follow it yet. After you have read each screenful, press {\tt SPACE} (i.e.
- the space bar) to see further screens of information.
-
- At this point it is only fair to tell you how to stop it. To stop a
- \rlab session you can type \verb+quit+ at the \rlab prompt. On Unix
- systems an \verb+EOF+ or \verb+^d+ (control-d) will also stop
- \rlab.
-
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \subsection{Help}
-
- To get a taste of the functions for which help is available, enter
-
- \begin{verbatim}
- > help
- \end{verbatim}
-
- The first group of topics lists functions and special help topics
- that are built into \RLaB. The special topics have names in upper case and
- are of a general nature. Lawyers recommend that you {\em now} read the help
- on topics {\tt CONDITIONS} and {\tt WARRANTY} by entering
-
- \begin{verbatim}
- > help CONDITIONS
- \end{verbatim}
- \begin{verbatim}
- > help WARRANTY
- \end{verbatim}
-
- The subsequent topics refer to commands that have been written in
- \RLaB\ script files, which we refer to as ``R-files''. These R-files
- are stored in directories, which the \verb+help+ command searches. The
- help files in the {\em \ldots /rlib} directory come as a standard part of
- \RLaB, and the remainder refer to local R-files that have been setup
- for you by whoever installed your \RLaB.
-
- In general, the functions listed in the first group are the most efficient
- as they are compiled into the core of \RLaB. In contrast, \RLaB's R-files
- have the extra overhead of reading and interpretation before they are
- executed. This lower efficiency associated with R-file interpretation is
- traded for the benefit of being able to write your own features into \RLaB.
- If an R-file feature is really useful, it can be added to the core \RLaB\
- program since you have the source code\footnote{Dynamic linking is
- part of the plan for a future release}.
-
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \subsection{Simple calculations} \label{simple-calc}
-
- \RLaB\ is designed for mathematical calculations so let's do some. The four
- basic arithmetic operators have symbols {\verb|+, -, *, /|} representing
- addition, subtraction, multiplication, and division respectively. Now enter
- some one line expressions as shown here:
-
- \begin{verbatim}
- > 2*4
- 8
- > 1/2
- 0.5
- > 1+11
- 12
- > 1-11
- -10
- > 1*2/3+4-5
- -0.333
- > 1/0
- inf
- > 0/(1/0)
- 0
- > 0/0
- NaN
- \end{verbatim}
-
- The $5^{th}$ expression illustrates compliance with the usual operator
- hierarchy and then we observe that \RLaB\ can handle
- exceptions\footnote{The ability to properly handle floating point
- exceptions is dependent upon the capabilities of the hardware and
- operating system, as well as the interests of the person installing
- \RLaB\ .} such as when $\infty$ (\verb+inf+) is a result or an input to
- further calculation; and also ``not-a-number'' (\verb+NaN+). \RLaB\ can use
- complex numbers as well as real numbers so now try
-
- \begin{verbatim}
- > 1/1i
- 0 - 1i
- > 1/1i + 1/1j
- 0 - 2i
- > 1/1i * 1/1j
- -1
- > 1/1i/1j
- -1
- \end{verbatim}
-
- where we see that {\tt i} or {\tt j} can represent the complex
- number $\sqrt{-1}$. No four function calculator is complete without a
- memory so now we look at how to store results in a variable.
-
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \subsection{Variable assignment and display}
-
- In \RLaB, variables can have names of any length containing most printable
- characters including $\{ a \ldots z , A \ldots Z , \_ \}$. You will observe
- that we have to exclude special characters such as {\verb|+, -, *, /|} and
- the {\tt SPACE} character. The actual assignment operator symbol is ``=''
- and an assignment statement looks like
-
- \begin{verbatim}
- variable_name = expression_to_evaluate
- \end{verbatim}
-
- and an example is
-
- \begin{verbatim}
- > radius=2
- radius =
- 2
- > circumference=2 * pi * radius
- circumference =
- 12.6
- \end{verbatim}
-
- where a variable {\tt radius} is created and initialised with the
- real value 2, and then a variable {\tt circumference} is created and filled
- with the result of evaluating the right hand side of the equation. To see
- the value of either of these variables, just enter their name and
- \RLaB\ will print their value. For a description of variable names, please read
- the help on {\tt VARIABLES}.
-
- As you have probably noticed by now, the result of each expression is
- automatically printed to the screen. This feature can be controlled by
- using the `\verb+;+' character. Terminating an expression with a
- `\verb+;+' will suppress printing of the result. Likewise, terminating
- an expression with the `\verb+?+' is an explicit way to force printing.
-
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \subsection{User Interface: command recall \& editing}
-
- Command line recall and editing is very useful for correcting command
- errors or to allow your commands to evolve. \RLaB\ provides a command
- recall and edit facility modeled on (and sometimes actually using) the GNU
- readline facility. If you are familiar with GNU emacs or the GNU bash
- shell, then try entering {\tt C-p} to scroll back through previous commands
- ({\tt C-p} means hold down the {\tt control} key and press {\tt p}). If
- this is successful, test the standard character and word editing commands
- to modify previous entries - if it works, skip to section
- \ref{sec:objects}.
-
- However, if the word GNU just means ``any of several African antelopes
- constituting the genus {\em Connochaetes} ...''\footnote{Australian
- Macquarie dictionary, ISBN: 0-949757-23-3.} but your keyboard does have the
- arrow keys \{\ $\leftarrow\ \uparrow\ \downarrow\ \rightarrow\ $\}, then
- you might still be able to take advantage of command line recall and
- editing. Try typing the $\uparrow$ key to see if any previous \RLaB\
- commands are displayed - if they are, then confirm that $\downarrow$ also
- displays more recent commands and then try horizontal cursor movement with
- the \{\ $\leftarrow\ \rightarrow\ $\} and try some editing with the delete
- key. Typing {\tt C-d} ought to delete the character beneath the cursor.
- When a new command has been created from an old, enter it in the usual way
- by pressing {\tt RETURN}. If this has worked for you, skip the remainder
- of this section (and count yourself lucky that we weren't describing a
- graphical user interface in one paragraph).
-
- If your keyboard is missing the arrow keys but {\tt C-p} did cause previous
- commands to pop up on the \RLaB\ command line, you will find that \{\
- $\leftarrow\ \uparrow\ \downarrow\ \rightarrow\ $\} are the same as \{\
- {\tt C-b C-p C-n C-f}\ \} - think of b for backwards, p for previous, n for
- next, and f for forward.
-
- Irrespective of what keystrokes you use for editing, the C-y keystroke will
- restore text previously deleted. If you were unable to scroll back through
- any previous commands (that you had just entered), then your \RLaB\ may have
- been built without command line editing - this is unlucky. As command
- line editing is such a useful feature, you should consider getting a
- better version of \RLaB\ if possible.
-
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
- \section{Objects---Basic Data Structures} \label{sec:objects}
-
- In the most general form, an object in \RLaB\ can be data or a
- function. It is even possible to construct an object that contains
- both data {\em and} functions - a fact that no doubt excites the
- hormones in the modern day object oriented programmer. We are going to
- discuss basic data types before looking at how data can be ``grouped''
- together for some useful purpose. We will also work through some
- simple examples that manipulate data but first, what does \Rlab\
- regard as data?
-
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
- \subsection{Data Types}
-
- There are three {\em fundamental} types of data that you manipulate in
- \RLaB: the string; the real number; and the complex number. As we have
- seen in section \ref{simple-calc}, it is straight-forward to
- manipulate numerical quantities. Characters are available in the form
- of strings which can contain 0 or more characters. In line with a
- philosophy to ``keep it simple'', \RLaB\, which is primarily concerned
- with numerical computation, has no special way to handle a single
- character\footnote{And also one less data type that you need to learn
- about.}. To enter a string, enclose the characters inside quotes like
- \verb+"this"+ e.g.
-
- \begin{verbatim}
- > "Hello world"
- Hello world
- \end{verbatim}
-
- Just as a number was previously stored in a variable, the same can be done
- with a string of characters. To place a string into a variable, you
- could enter a statement such as
-
- \begin{verbatim}
- > hw = "Hello world"
- Hello world
- \end{verbatim}
-
- and the value of variable \verb+hw+ may be printed out by entering
-
- \begin{verbatim}
- > hw
- Hello world
- \end{verbatim}
-
- The observant reader might be wondering what has happened to the
- boolean data type? In \RLaB, {\em true} and {\em false} are
- represented by the integers 1 and 0. Just as the data type char can be
- handled as a rather small string (length=1), so the data type boolean
- (or logical) can be handled by small numbers (value=0,1). We have now
- met the 3 fundamental types of data processed in \RLaB\ and it is now
- possible to understand a little more about how data structures and
- functions are organised within \RLaB.
-
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \subsection{Object Hierarchy}
-
- Scan your eyes down over Figure \ref{fig:objects} which shows the
- hierarchical structure of objects in \RLaB\ - we shall now describe
- this figure from the bottom up (ignoring lists until a little
- later). Not all objects are created in the same way and what you can do with
- or to them depends on their {\em class}. Items of class {\em function}
- contain program instructions which is one form of data or
- information. Items of class {\em numeric}, and {\em string} contain
- data that \RLaB\ instructions can manipulate.
-
- \begin{figure}[htbp]
- \begin{picture}(350,300)(0,25) % (x-size, y-size) (x-shift, y-shift)
- \special{psfile=object.ps
- angle=0 hscale=65 vscale=65 voffset=-55 hoffset=40}
- \end{picture}
- \caption{\RLaB objects} \label{fig:objects}
- \end{figure}
-
- A numeric class item can store a real or complex number. An item of
- class string contains a null-terminated string of character(s). When
- we want to access or create an array of items, we use an array syntax
- that is the same for both string and numeric classes.
-
- It is often helpful to a programmer to group together unlike data into
- a single object - this is the purpose of the class list. We are not
- going to describe it in great detail here except to point out that it
- serves a similar role to a record in Pascal or a structure in C, but
- with a somewhat more flexible access mechanism. Note that lists can
- contain any of the aforementioned objects, even another list.
-
- One thing that you can always do with any item is ask \RLaB\ what its
- class is. For example, \RLaB\ has a built-in command to calculate the
- sin of an angular quantity - asking \RLaB\ about it gives the
- following response
-
- \begin{verbatim}
- > class( sin )
- function
- \end{verbatim}
-
- From the size of the list of topics that help is available on, you
- probably realise that there are many built-in functions in \RLaB\ -
- expect gratuitous use of these functions as further examples are
- given. Remember that you can find out about any function by typing
- {\tt help} {\em function-name}. We are particularly interested in
- exploring the use of \RLaB\ as a computation tool so now we describe
- further numeric operations.
-
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \subsection{Numerics}
-
- The \RLaB\ numeric class includes objects of type real and
- complex. The numeric object also encompasses objects of scalar,
- vector, or matrix dimension. If you want to, you can think of all
- numeric objects as matrices. Thus, a vector is simply a 1-by-N
- matrix, and a scalar is a 1-by-1 matrix. Since the numeric object
- is most commonly used, it will get the most coverage.
-
- \subsubsection{Matrix Creation }
-
- The simplest way to create a matrix is to type it in at the command
- line:
-
- \begin{verbatim}
- > m = [ 1, 2, 3; 4, 5, 6; 7, 8, 9 ]
- m =
- 1 2 3
- 4 5 6
- 7 8 9
- \end{verbatim}
-
- In this context the `\verb+[ ]+' signal \Rlab\ that a matrix should
- be created. The inputs (or arguments) for matrix creation are
- whatever is inside the `\verb+[ ]+'. The rows of the matrix are
- delimited with `\verb+;+' and the elements of each row are
- delimited with `\verb+,+'.
-
- Users can use most any expression when creating matrix elements.
- Other matrices, function evaluations, and arithmetic operations are
- allowed when creating matrix elements. In the next example, we will
- create a direction cosine matrix using the built-in trigonometric
- functions within the `\verb+[ ]+'.
-
- \begin{verbatim}
- > a = 45*(2*pi)/360
- a =
- 0.785
- > A = [ cos(a), sin(a); -sin(a), cos(a) ]
- A =
- 0.707 0.707
- -0.707 0.707
- \end{verbatim}
-
- Matrices can also be read from disk-files. The functions
- \verb+read+, \verb+readb+ and \verb+readm+ can read matrix values
- from a file. The \verb+read+ function uses a special ASCII text
- file format, and is capable of reading not only matrices, but
- strings, and lists as well. Since the file can contain many data
- objects, and their variable names, \verb+read+ is used like:
-
- \begin{verbatim}
- > read ( "file.dat" );
- \end{verbatim}
-
- The variables are read from \verb+file.dat+ and installed in the
- global-symbol-table.
-
- The \verb+readb+ function works like \verb+read+, except it reads
- binary files for greater efficiency. The binary files created with
- \verb+writeb+ are portable across computers that use IEEE floating
- point format.
-
- The \verb+readm+ function reads a text file that contains
- white-space separated columns of numbers. \verb+readm+ is most
- often used to read in data created by other programs. Since
- \verb+readm+ is only capable of reading in one matrix per file, and
- no variable name information is available, \verb+readm+ is used
- like:
-
- \begin{verbatim}
- > a = read ( "a.dat" );
- \end{verbatim}
-
- \subsubsection{Vector Creation}
-
- Although there is no distinct vector type in \RLaB\ , you can
- pretend that there is. If your algorithm, or program does not need
- two dimensional arrays, then you can use matrices as singly
- dimensioned arrays.
-
- When using vectors, or single dimension arrays, row matrices are
- created. The simplest way to create a vector is with the `\verb+:+'
- operator(s), that is `\verb+start:end:inc+'. The leftmost operand,
- \verb+start+, specifies the starting value, the second operand,
- \verb+end+, specifies the last value. The default increment, or
- spacing, is 1. A third optional operand, \verb+inc+, can be used
- to specify any increment.
-
- \begin{verbatim}
- > v = 1:4
- v =
- 1 2 3 4
- \end{verbatim}
-
- \subsubsection{Matrix Attributes}
-
- Matrix attributes, such as number of rows, number of columns, total
- number of elements, are accessible in several ways. All attributes
- are accessible through function calls, for example:
-
- \begin{verbatim}
- > a = rand(3,5);
- > show (a)
- name: a
- class: num
- type: real
- nr: 3
- nc: 5
- > size (a)
- 3 5
- > class (a)
- num
- > type (a)
- real
- \end{verbatim}
-
- Matrix attributes are also accessible via a shorthand notation:
-
- \begin{verbatim}
- > a.nr
- 3
- > a.nc
- 5
- > a.n
- 15
- > a.class
- num
- > a.type
- real
- \end{verbatim}
-
- Note that these matrix attributes are ``read-only''. In other
- words: assignment to \verb+a.nr+ is pointless. In fact it will
- destroy the contents of \verb+a+ and create a list with element
- named \verb+nr+. If you wish to change a matrix attribute, you must
- do so by changing the data in \verb+a+. For example: if you want to
- make \verb+a+ complex:
-
- \begin{verbatim}
- > a = a + zeros (size (a))*1i;
- > show(a)
- name: a
- class: num
- type: complex
- nr: 3
- nc: 5
- \end{verbatim}
-
- If you want to change the number of rows, or columns of \verb+a+:
-
- \begin{verbatim}
- > a = reshape (a, 1, 15);
- > show(a)
- name: a
- class: num
- type: complex
- nr: 1
- nc: 15
- \end{verbatim}
-
- \subsubsection{Element Referencing}
-
- Any expression that evaluates to a matrix can have its elements
- referenced. The simplest case occurs when a matrix has been created
- and assigned to a variable. One can reference single elements, or
- one can reference full or partial rows and/or columns of a matrix.
- Element referencing is performed via the `{\verb+[ ]+}' operators,
- using the `\verb+;+' to delimit row and column specifications, and
- the `\verb+,+' to delimit individual row or column specifications.
-
- To reference a single element:
-
- \begin{verbatim}
- > a = [1,2,3; 4,5,6; 7,8,9];
- > a [ 2 ; 3 ]
- 6
- \end{verbatim}
-
- To reference an entire row, or column:
-
- \begin{verbatim}
- > a [ 2 ; ]
- 4 5 6
- > a [ ; 3 ]
- 3
- 6
- 9
- \end{verbatim}
-
- To reference a sub-matrix:
-
- \begin{verbatim}
- > a [ 2,3 ; 1,2 ]
- 4 5
- 7 8
- \end{verbatim}
-
- As stated previously, any expression that evaluates to a matrix can
- have its elements referenced. A very common example is getting the
- row or column dimension of a matrix:
-
- \begin{verbatim}
- > size (a)[1]
- 3
- \end{verbatim}
-
- In the previous example the function \verb+size+ returns a
- two-element matrix, from which we extract the 1st element (the
- value of the row dimension). Note that we referenced the return
- value (a matrix) as if it were a vector. Referencing matrices in
- ``vector-fashion'' is allowed with all matrices. When
- vector-indexing is used, the matrix elements are referenced in
- column order. As with matrix indexing, a combination of vector
- elements can be referenced:
-
- \begin{verbatim}
- > a[3]
- 7
- > a[3,4,9]
- 7 2 9
- \end{verbatim}
-
- \subsubsection{Assignment}
-
- Matrices can be assigned to in whole or in part. We have shown
- complete matrix assignment in the examples of the last few pages. In
- the same way that matrix elements can be referenced singly, or in
- groups, matrices can have single elements re-assigned, or groups of
- elements re-assigned. The result of an assignment expression is the
- left-hand-side (LHS). This is more convenient when working
- interactively, and when creating intermediate function arguments.
-
- \begin{verbatim}
- > a[2;2] = 200
- a =
- 1 2 3
- 4 200 6
- 7 8 9
- > a[2,3;2,3] = [200,300;300,400]
- a =
- 1 2 3
- 4 200 300
- 7 300 400
- \end{verbatim}
-
- The row and column dimensions of the matrices on the RHS, and the
- matrix description within the `\verb+[ ]+' must have the same
- dimensions.
-
-
- \subsubsection{Matrix Operations}
-
- The usual mathematical operators {\verb|+,-,*,/|} operate on
- matrices as well as scalars. For {\verb+A binop B+}:
-
- \begin{description}
- \item[{\tt +}] Does element-by-element addition of two matrices.
- The row and column dimensions of both \verb+A+ and
- \verb+B+ must be the same. An exception to the
- aforementioned rule occurs when either \verb+A+ or
- \verb+B+ is a 1-by-1 matrix; in this case a
- scalar-matrix addition operation is performed.
-
- \item[{\tt -}] Does element-by-element subtraction of two matrices.
- The row and column dimensions of both \verb+A+ and
- \verb+B+ must be the same. An exception to the
- aforementioned rule occurs when either \verb+A+ or
- \verb+B+ is a 1-by-1 matrix; in this case a
- scalar-matrix addition operation is performed.
-
- \item[{\tt *}] Performs matrix multiplication on the two
- operands. The column dimension of {\verb+A+} must match
- the row dimension of {\verb+B+}. An exception to the
- aforementioned rule occurs when either \verb+A+ or
- \verb+B+ is a 1-by-1 matrix; in this case a
- scalar-matrix multiplication is performed.
-
- \item[{\tt /}] Performs matrix ``right-division'' on its operands.
- The matrix right-division (\verb+B/A+) can be thought of
- as {\verb+B*inv (A)+}. The column dimensions of \verb+A+
- and \verb+B+ must be the same. Internally right division
- is the same as ``left-division'' with the arguments
- transposed.
-
- \[ B / A = ( A^T \setminus B^T )^T \]
-
- The exception to the aforementioned dimension rule
- occurs when \verb+A+ is a 1-by-1 matrix; in this case a
- matrix-scalar divide occurs.
-
- \end{description}
-
- Additionally, \RLaB\ has several other operators that function on
- matrix operand(s).
-
-
- \begin{description}
- \item[{\tt .+}] Performs element-by-element addition on
- its operands. The operands must have the same row and
- column dimensions. {\em Unless}:
-
- \begin{itemize}
-
- \item \verb+A+ or \verb+B+ is a 1x1. In this case the
- operation is performed element-by-element over the
- entire matrix. The result is a MxN matrix.
-
- \item \verb+A+ or \verb+B+ is a 1xN. and the other is
- MxN. In this instance the operation is performed
- element-by-element fashion for each row in the
- matrix. The result is a MxN matrix.
-
- \item \verb+A+ or \verb+B+ is a Nx1. and the other is
- NxM. In this instance the operation is performed
- element-by-element fashion for each column in the
- matrix. The result is a NxM matrix.
-
- \end{itemize}
-
- \item[{\tt .-}] Performs element-by-element subtraction on
- its operands. The operands must have the same row and
- column dimensions. {\em Unless}:
-
- \begin{itemize}
-
- \item \verb+A+ or \verb+B+ is a 1x1. In this case the
- operation is performed element-by-element over the
- entire matrix. The result is a MxN matrix.
-
- \item \verb+A+ or \verb+B+ is a 1xN. and the other is
- MxN. In this instance the operation is performed
- element-by-element fashion for each row in the
- matrix. The result is a MxN matrix.
-
- \item \verb+A+ or \verb+B+ is a Nx1. and the other is
- NxM. In this instance the operation is performed
- element-by-element fashion for each column in the
- matrix. The result is a NxM matrix.
-
- \end{itemize}
-
- \item[{\tt .*}] Performs element-by-element multiplication on
- its operands. The operands must have the same row and
- column dimensions. {\em Unless}:
-
- \begin{itemize}
-
- \item \verb+A+ or \verb+B+ is a 1x1. In this case the
- operation is performed element-by-element over the
- entire matrix. The result is a MxN matrix.
-
- \item \verb+A+ or \verb+B+ is a 1xN. and the other is
- MxN. In this instance the operation is performed
- element-by-element fashion for each row in the
- matrix. The result is a MxN matrix.
-
- \item \verb+A+ or \verb+B+ is a Nx1. and the other is
- NxM. In this instance the operation is performed
- element-by-element fashion for each column in the
- matrix. The result is a NxM matrix.
-
- \end{itemize}
-
- \item[{\tt ./}] Performs element-by-element division on its
- operands. The operands must have the same row and column
- dimensions. {\em Unless}:
-
- \begin{itemize}
-
- \item \verb+A+ or \verb+B+ is a 1x1. In this case the
- operation is performed element-by-element over the
- entire matrix. The result is a MxN matrix.
-
- \item \verb+A+ or \verb+B+ is a 1xN. and the other is
- MxN. In this instance the operation is performed
- element-by-element fashion for each row in the
- matrix. The result is a MxN matrix.
-
- \item \verb+A+ or \verb+B+ is a Nx1. and the other is
- NxM. In this instance the operation is performed
- element-by-element fashion for each column in the
- matrix. The result is a NxM matrix.
-
- \end{itemize}
-
- \item[$\setminus$] Performs matrix ``left-division''. Given
- operands {\verb+A\B+} matrix left division is the
- solution to the set of equations $Ax = B$. If $B$ has
- several columns, then each column of $x$ is a solution
- to {\verb+A*x[;i] = B[;i]+}. The row dimensions of
- \verb+A+ and \verb+B+ must agree.
-
- \item[$.\setminus$] Performs element-by-element left-division.
- Element-by-element left-division is provided for
- symmetry, and is equivalent to \verb+B./A+. The row and
- column dimensions of \verb+A+ and \verb+B+ must agree,
- {\em unless}:
-
- \begin{itemize}
-
- \item \verb+A+ or \verb+B+ is a 1x1. In this case the
- operation is performed element-by-element over the
- entire matrix. The result is a MxN matrix.
-
- \item \verb+A+ or \verb+B+ is a 1xN. and the other is
- MxN. In this instance the operation is performed
- element-by-element fashion for each row in the
- matrix. The result is a MxN matrix.
-
- \item \verb+A+ or \verb+B+ is a Nx1. and the other is
- NxM. In this instance the operation is performed
- element-by-element fashion for each column in the
- matrix. The result is a NxM matrix.
-
- \end{itemize}
-
- \item[${}^\wedge{}$] {\verb+A^B+} raises \verb+A+ to the \verb+B+
- power. When \verb+A+ is a matrix, and \verb+B+ is an
- integer scalar, the operation is performed by successive
- multiplications. When \verb+B+ is not an integer, then
- the operation is performed via \verb+A+'s eigenvalues
- and eigenvectors. The operation is not allowed if
- \verb+B+ is a matrix.
-
- \item[${.}^\wedge{}$] {\verb+A.^B+} raises \verb+A+ to the
- \verb+B+ power in an element-by-element fashion. Either
- \verb+A+ or \verb+B+ can be matrix or scalar. If both
- \verb+A+ and \verb+B+ are matrix, then the row and
- column dimensions must agree.
-
- \item[{\tt '}] This unary operator performs the matrix transpose
- operation. \verb+A'+ swaps the rows and columns of A.
- For a matrix with complex elements a complex conjugate
- transpose is performed.
-
- \item[{\tt .'}] This unary operator performs the matrix
- transpose operation. \verb+A.'+ swaps the rows and
- columns of A. The difference between \verb+'+ and
- \verb+.'+ is only apparent when \verb+A+ is a complex
- matrix; then \verb+A.'+ does not perform a complex
- conjugate transpose.
-
- \end{description}
-
- Several details are important to note:
-
- \begin{itemize}
-
- \item The two character operators are just that, two characters. White
- space, or any other character in between the two symbols is
- an error, or may be interpreted differently.
-
- \item The expression \verb+2./A+ is {\bf not} interpreted as
- \verb+2. /A+. \Rlab\ is smart enough to group the period with
- the `\verb+/+'.
-
- \end{itemize}
-
- \subsubsection{Matrix Relational Operations}
-
- The way matrices can be used within if-statement tests is special.
- The result of a matrix relational test, such as \verb+A == B+, is a
- matrix the same size as \verb+A+ and \verb+B+ filled with ones and
- zeros according to the result of an element-by-element test. If
- either of the operands is scalar, or a 1-by-1 matrix, then the
- element-by-element test is performed as before, by using the scalar
- value repeatedly. For example.
-
- \begin{verbatim}
- > a = [1, 2, 3; 4, 5, 6; 7, 8, 9];
- > b = a';
- > a == b
- 1 0 0
- 0 1 0
- 0 0 1
- > a >= 5
- 0 0 0
- 0 1 1
- 1 1 1
- \end{verbatim}
-
- \RLaB\ if-tests do not accept matrices. The built-in functions
- \verb+any()+ and \verb+all()+ can be used in combination with
- relational and logical tests to conditionally execute statements
- based upon matrix properties. For example: perform a test that
- returns true or false (0 or 1) if \verb+a+ contains the value 4.
-
- \begin{verbatim}
- > any ( any (a == 4))
- \end{verbatim}
-
- The function \verb+any()+ returns true if any of the element(s) of
- its argument are non-zero. The function \verb+all()+ returns true
- if all of the element(s) of its argument are non-zero. Note that
- \verb+any+ is used twice; this is because \verb+any+ is a
- vector-oriented function. This will be discussed later.
-
- \subsubsection{Examples}
-
- Now it is time for a few illustrative examples \ldots
-
- Suppose you are learning about normal-equations, orthogonal
- transformations, QR decompositions, etc.\footnote{You've been
- reading Kahaner, Moler, and Nash ``Numerical Methods and Software''
- for example.} You have read the proper sections in your text(s), and
- you want to try your hand at it to see if you really understand it.
-
- First you create an over-determined coefficient matrix, 3
- parameters, and 5 equations (\verb+a+). Then you create an
- observation matrix (\verb+b+):
-
- \begin{verbatim}
- > a = [3,4,1;0,2,2;0,0,7;zeros(2,3)];
- > b = [14;10;21;6;2];
- \end{verbatim}
-
- You've just read that the \RLaB\ operator `\verb+\+' solves systems
- of equations, so you try it out:
-
- \begin{verbatim}
- > x = a \ b
- x =
- 1
- 2
- 3
- \end{verbatim}
-
- You check the answer (note that this is a contrived problem):
-
- \begin{verbatim}
- > b - a*x
- -7.11e-15
- -1.78e-15
- -1.42e-14
- 6
- 2
- \end{verbatim}
-
- and it looks ``OK''. The residual in the first three rows is near
- the machine-epsilon\footnote{Machine-epsilon is the smallest number
- that your computer can distinguish. A common way to determine
- machine-epsilon is to divide a variable ({\tt eps})
- by two until {\tt 1.0 + eps == 1.0}.}.
- Now you wish to follow the example in the
- text more closely, in an attempt to reinforce your reading. The
- text has stated that the ``normal equations'' are:
- $(A^{T}A)x = (A^{T}b)$.
-
- Not having read the chapter on Gaussian elimination, and matrix
- inverses yet you try:
-
- \begin{verbatim}
- > x = inv (a'*a) * (a'*b)
- x =
- 1
- 2
- 3
- \end{verbatim}
-
- Fortunately, the problem we are working with is not
- ill-conditioned, otherwise we may have produced a terrible result
- with the above procedure. If you want to pursue the reasoning
- behind the previous statement I suggest you read the section
- ``Linear Systems of Equations''.
-
- Well, this is all too easy, now you want to get dirty, so you move
- on to orthogonal transformations. You have read about the
- construction of Householder vectors and reflections; now you would
- like to try it first-hand. You know that:
-
- \[ P = I - 2(vv^{T})/(v^{T}v) \]
-
- Where $v$ is the Householder vector used to form the reflection
- matrix. First you must construct the vector. Your
- text\footnote{Mine in this case is Golub and VanLoan, ``Matrix
- Computations''.} tells you that a good method for constructing the
- Householder vector is:
-
- \[ v[2:n] = x[2:n] / (x[1] + sign(x[1]) * \|x\|_{2}) \]
- \[ v[1] = 1 \]
-
- \begin{verbatim}
- > a = rand(5,2); // Start out with a more difficult [A]
- > a
- a =
- 0.655 0.265
- 0.129 0.7
- 0.91 0.95
- 0.112 0.0918
- 0.299 0.902
- > ac1 = a[;1]; // grab the 1st column of [a] to work with
- > u = norm (ac1, "2"); // compute the 2-norm of [ac1]
- > v[2:5] = ac1[2:5] / (ac1[1] + sign (ac1[1])*u)
- v =
- 0 0.0705 0.498 0.0611 0.164
- > v[1] = 1;
- > v = v'; // make v a column vector
- \end{verbatim}
-
- By using the matrix creation, and element referencing features you
- have generated the vector in 4 commands. We could have used
- a signal command
-
- \begin{verbatim}
- > v = [ 1 , a[;1][2:5]' / (a[1;1] + sign(a[1;1])*norm(a[;1],"2")) ]'
- \end{verbatim}
-
- But, this is less than clear. Note that in this case, since we are
- working with vectors, we only use a single index when subscripting
- the variables.
-
- Now that we have our Householder vector, we are ready to assemble
- the Householder reflection (matrix).
-
- \begin{verbatim}
- > P = eye (5,5) - 2*(v*v')/(v'*v)
- P =
- -0.558 -0.11 -0.776 -0.0952 -0.255
- -0.11 0.992 -0.0547 -0.00671 -0.018
- -0.776 -0.0547 0.614 -0.0474 -0.127
- -0.0952 -0.00671 -0.0474 0.994 -0.0156
- -0.255 -0.018 -0.127 -0.0156 0.958
- > P*a
- -1.17 -1.2
- -1.65e-17 0.596
- -1.54e-16 0.22
- -1.31e-17 0.00217
- -5.39e-17 0.662
- \end{verbatim}
-
- As you can see it worked out just like they said it would. All the
- elements of the first column of $A$, below the diagonal, have been
- zeroed out\footnote{Although the numbers are not identically zero,
- they are on the order of machine precision, and can be considered
- to be zero. Some programs use fixed-point precision when printing.
- Although this makes their output look more accurate, it is
- not.}. In this manner we can proceed to transform $A$ into an upper
- triangular matrix.
-
- \clearpage
-
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
- \section{Program Flow Control}
-
- We must now take a small diversion before proceeding on with the
- rest of the objects and discuss flow-control. The flow-control
- statements available in \RLaB\ are the {\em if-statement}, the {\em
- while-statement}, the {\em for-statement}, the {\em break-statement}
- and the {\em continue-statement}.
-
- The flow-control statements use a syntax that is {\em similar} to
- the C-language\footnote{Note we said similar, not identical.}.
- Braces `\verb+{+' and `\verb+}+' are {\em required} in all of the
- flow-control statements.
-
- \subsection{If-Statement}
-
- The {\em if-statement} performs a test on the expression in
- parenthesis, and executes the statements enclosed within braces if
- the expression is true. The expression must evaluate to a
- scalar-expression. If the expression evaluates to a vector or
- matrix a run-time error will result.
-
- \begin{tabbing}
- 123456 \= 1234 \= \kill
- \> if \ (\ {\it expression} \ ) \nopagebreak \\
- \> \{ \\
- \> \> {\it statements} \\
- \> \} \\
- \end{tabbing}
-
- \begin{verbatim}
- > if ( 1 ) { "TRUE" }
- TRUE
- > if ( 0 ) { "TRUE" }
- \end{verbatim}
-
- An optional `\verb+else+' keyword is allowed to delineate statements
- that will be executed if the expression tests false:
-
- \begin{verbatim}
- > if ( 0 ) { "TRUE" else "FALSE" }
- FALSE
- \end{verbatim}
-
- The \verb+any+ and \verb+all+ functions are useful with {\em
- if-statements}. If we want to execute some statements, conditional
- on the contents of a matrix:
-
- \begin{verbatim}
- > a=[1,2;3,0];
- > if (!all (all (a))) { "a has a zero element" }
- a has a zero element
- \end{verbatim}
-
- \subsection{While-Statement}
-
- The {\em while-statement} tests the expression in parenthesis, and
- executes the statements enclosed within braces until the expression
- is false. The expression must evaluate to a scalar-expression. If
- the expression evaluates to a vector or matrix a run-time error
- will result.
-
-
- \begin{tabbing}
- 123456 \= 1234 \= \kill
-
- \> while \ (\ {\it expression} \ ) \\
- \> \{ \\
- \> \> {\it statements} \\
- \> \} \\
- \end{tabbing}
-
- \begin{verbatim}
- > while ( 0 ) { "TRUE" }
- > i = 0;
- > while ( i < 2 ) { i = i + 1 }
- i =
- 1
- i =
- 2
- \end{verbatim}
-
- \subsection{For-Statement}
-
- The {\em for-statement} executes the statements enclosed in braces
- $N$ times, where $N$ is the number of values in {\it
- vector-expression}. Each time the statements are executed {\it
- variable} is set to the $k^{th}$ value of {\it vector-expression},
- where $k = 1 \ldots\ N$.
-
- \begin{tabbing}
- 123456 \= 1234 \= \kill
-
- \> for \ (\ {\it variable} in {\it vector-expression} \ ) \\
- \> \{ \\
- \> \> {\it statements} \\
- \> \} \\
- \end{tabbing}
-
- \begin{verbatim}
- > for ( i in 1:3 ) { i }
- i =
- 1
- i =
- 2
- i =
- 3
- \end{verbatim}
-
- {\it vector-expression} can be any type of vector: real, complex,
- and string vectors are all acceptable.
-
- \subsection{Break and Continue Statements}
-
- The {\em break} and {\em continue} statements are simply keywords.
- Usage of {\em break} and {\em continue} is only allowed within {\em
- while-statements} or {\em for-statements}. {\em break} will cause
- execution of the current loop to terminate. {\em continue} will
- cause the next iteration of the current loop to begin.
-
- \begin{verbatim}
- > for ( i in 1:100 ) { if (i == 3) { break } } i
- i =
- 3
- > for ( i in 1:4 ) { if (i == 2) { continue } i }
- i =
- 1
- i =
- 3
- i =
- 4
- \end{verbatim}
-
- Although they will not be explicitly discussed - there are more
- examples of flow-control statement usage throughout the remainder
- of the primer.
-
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
- \section{Objects---Program Functions} \label{sect-functions}
-
- Like matrices and strings, functions are stored as ordinary
- variables in the symbol table. Function's treatment as variables
- explains the somewhat peculiar syntax required to create and store
- a function.
-
- \begin{verbatim}
- > logsin = function ( x ) { return log (x) .* sin (x) }
- <user-function>
- \end{verbatim}
-
- The above statement creates a function, and assigns it to the
- variable \verb+logsin+. The function can then be used like:
-
- \begin{verbatim}
- > logsin ( 2 )
- 0.63
- \end{verbatim}
-
- Like variables, function can be copied, re-assigned, and destroyed.
-
- \begin{verbatim}
- > y = logsin
- <user-function>
- > y (2)
- 0.63
- >
- > // Overwrite it with a matrix
- > logsin = rand (2,2);
- >
- > // Check that y is still a function
- > y (3)
- 0.155
- \end{verbatim}
-
- If you try re-assigning a built-in function you will get a run-time
- error message. The built-in functions, those that are programmed in
- C, are a permanent part of the environment. So that users may
- always rely on their availability, they cannot be re-assigned, or
- copied.
-
- Variables that represent user-functions can also be part of list
- objects. Sometimes it can be useful to group functions that serve a
- similar purpose, or perform different parts of a larger procedure.
-
- \begin{verbatim}
- list = << logsin = logsin >>
- logsin
- > list.logsin (2)
- 0.63
- > list.expsin = function ( x ) { return exp (x) .* sin (x) }
- expsin logsin
- > list.expsin (2)
- 6.72
- \end{verbatim}
-
- \subsection{Function Syntax}
-
- The function syntax is fairly simple. The basic form of a function
- is:
-
- \begin{tabbing}
- 123456 \= 1234 \= \kill
-
- \> function \ (\ {\it argument list} \ ) \\
- \> \{ \\
- \> \> \\
- \> \> {\it statements} \\
- \> \> \\
- \> \} \\
- \end{tabbing}
-
- If a syntax error is encountered while the function is being
- entered (read), definition of the function must begin again from
- the very beginning.
-
- There are several statements that only make sense within functions:
-
- \begin{tabbing}
- 123456 \= 1234 \= \kill
- \> global \ (\ {\it global-var-1, global-var-2 \ldots} \ ) \\
-
- \> local \ (\ {\it local-var-1, local-var-2 \ldots} \ ) \\
-
- \> return {\it expression} \\
-
- \end{tabbing}
-
-
- The \verb+global+ and \verb+local+ statements are optional. There
- are no restrictions on the number of \verb+local+ or \verb+global+
- statements or where they occur in the function. However, since
- these two statements only affect variables that are used {\em
- after} the declaration, it is recommended that you use \verb+local+
- and \verb+global+ at the {\em beginning} of each function.
-
- The \verb+return+ statement is also optional. There are no
- restrictions on the number of return statements, or their
- placement. A function can return from any point in its
- execution. The return statement must return a value. The value can
- be any \RLaB\ object.
-
- \subsection{Function Scoping Rules}
-
- When you start a \rlab\ session, either interactively or in
- batch-mode, you create an environment. The environment or workspace
- consists of the built-in functions, and any other variables or
- functions you may have added. The workspace will also be referred
- to as the global-symbol-table or the global scope.
-
- There are two other types of environment available: a function's
- local environment and a file's static environment\footnote{We will
- use the term environment and scope interchangeably.}
-
- A function's local scope is temporary, it is created when the
- function is invoked, and is destroyed when the function returns. A
- file's static scope is created when the file is loaded, and remains
- intact until the \rlab\ session is terminated.
-
- The different scopes serve to protect data from operations that
- occur in the other scopes. There is some degree of overlap in order
- to allow flexibility. Functions can affect file-static and global
- scopes; statements within files can affect statements within other
- files and the global scope. More simply put, the "lower" scopes
- generally have access to the "higher" scopes. When a variable is
- used, \rlab\ uses certain rules to "bind" the variable. When we use
- the term bind or bound, we mean that the variable name is
- associated with an entry in one of the three types of symbol
- tables.
-
-
- \begin{description}
-
- \item[File-Scope:] Variables that are in a file (but not within a
- function) are bound to the global-symbol-table (global-scope
- or global-environment) unless a static declaration is
- used. When a variable is declared static it is bound to the
- file's symbol table. From that point on, the variable will
- remain bound to the file's scope. When a variable is declared
- static, it is not visible from the global environment or from
- any other files.
-
- \item[Function Local Scope:] In general, variables used within a
- function (other than the function's arguments) are bound to
- the function's local scope (there are ways to override this
- behavior). Variables bound to a function's local scope are not
- visible from a file's scope or from the global scope. They are
- created (undefined) when the function is invoked, and
- destroyed when the function returns.
-
- There are exceptions: variables used in a function context are
- bound to the global-symbol-table. For example:
-
- \begin{verbatim}
- x = a * sin ( pi )
- \end{verbatim}
-
- \verb+sin+ is used in a function context, and is bound to the
- global scope, while \verb+x+, \verb+a+, and \verb+pi+ are
- bound to the function's local environment.
-
- Function's that are defined within a file have full access to
- the file's static variables. Function variables will be bound
- to the file's scope before local binding occurs.
-
- \begin{verbatim}
- ---- beginning of file.r ----
-
- static (A, pi)
- pi = atan(1)*4;
-
- fun = function ( a ) { return A*sin(pi*A*a); }
-
- ---- end of file.r ----
- \end{verbatim}
-
- When `fun' is created it binds `A' and `pi' to file.r's static
- environment.
-
- There are two declarations: `global' and `local' that can be
- used to override the default behavior if necessary. Variables
- declared local will be bound to the function's local scope,
- and variable declared global will be bound to the global
- scope.
-
- \end{description}
-
- \subsection{Function Argument Passing}
-
- Arguments can be passed by reference, or value. The default
- behavior is to pass by reference. Pass by references indicates that
- the variables used in the function call are directly referenced
- from within the function. Pass by value means that only the value
- of the argument is passed to the function. In other words, the
- arguments are copied. In order to pass a function argument by
- value, the user needs to declare that function argument as
- local. This method allows users to selectively determine how to
- pass each function argument.
-
- A function can be called with fewer arguments than specified in the
- definition; this is called a ``short-list''. When this situation
- occurs, \rlab\ pads the argument list with extra undefined
- variables. Arguments can be ``skipped'' when calling a
- function. The ``skipped'' arguments are passed to the function as
- undefined variables. To ``skip'' an argument just leave it out of
- the argument list, but don't forget the commas:
-
- \begin{verbatim}
- > x = function ( a, b, c, d ) { a ? b ? c ? d ? }
- <user-function>
- > x (1); // short-list
- 1
- UNDEFINED
- UNDEFINED
- UNDEFINED
- > x(1,,2); // skipped arguments
- 1
- UNDEFINED
- 2
- UNDEFINED
- \end{verbatim}
-
- As far as \RLaB\ is concerned undefined variables do not exist. The
- function \verb+exist+ will return true (1) if its argument exists,
- and false (0) if its argument is undefined.
-
- A function cannot be called with more arguments than specified in
- the function definition. If you attempt to do so, a run-time error
- will result.
-
- Function argument classes and class-types are not specified during
- definition. When writing ``robust'' functions the author should
- take some care to check that the function argument(s) are of the
- correct class and type, if necessary. The documentation (comments)
- should clearly define the requisite argument types and the function
- return object. If the function documentation does not clearly state
- that the arguments will be modified during function execution, care
- should be exercised to avoid changing any of the function
- arguments. If necessary, the function arguments can be passed by
- value so that changes will not affect the caller's variables.
-
- If you wish to write function(s) to serve as often used utilities
- or libraries, then care should be taken to declare all variables
- (other than function arguments or built-in functions) as
- local. Declaring all function variables as local will prevent
- accidental destruction of user's global variables.
-
- \RLaB\ has a special built-in function (\verb+fvscope+) that
- analyzes user-functions, and makes a report describing which
- variables are local, arguments, global, or
- file-static. \verb+fvscope+ can be very helpful when writing your
- first function(s) to help you understand how \RLaB\ resolves
- variable references.
-
- \subsection{Function Recursion}
-
- Functions can call themselves recursively. Each time execution
- passes into the function the local variables are (re)created. There
- is a special keyword: \verb+$self+, which must be used to force a
- function to refer to itself.
-
- \begin{verbatim}
- fac = function ( a )
- {
- if(a <= 1)
- {
- return 1;
- else
- return a*$self (a-1);
- }
- };
- \end{verbatim}
-
- In the previous example a factorial computation is performed using
- recursion\footnote{Not necessarily an efficient way to compute the
- factorial.}. In the second return statement, the function calls
- itself until $a \leq 1$.
-
- \subsection{Files}
-
- Simple ``one-liner'' functions can be typed in at the command line.
- However, they are destroyed when the \RLaB\ session is ended. Most
- users will want to create their functions in a text-editor as
- ordinary ASCII files.
-
- The function \verb+load+ will execute the \rlab\ statements in a
- file as if they were typed at the command line. The \rlab\ command
- \verb+rfile+ searches a specified path for files with a `.r'
- extension. When the \verb+rfile+ command finds a file that matches
- its argument, it executes the \rlab\ statements in the file as if
- they were typed at the command line.
-
- Statements in a file are executed in the same manner as they would
- be had they been typed in interactively. Files containing ordinary
- commands and multiple functions are acceptable. In fact, complete
- programs can be written and run interactively or in batch mode. To
- run a program in batch mode you can try:
-
- \begin{verbatim}
- % rlab program.r &
- \end{verbatim}
-
- Or the program could contain \verb+#!/usr/local/bin/rlab+ on the
- first line. Then, if your operating system provides the proper
- support, \rlab\ can execute your program, interactively, or in the
- background by simply typing:
-
- \begin{verbatim}
- $ chmod +x program.r
- $ ./program.r
- \end{verbatim}
-
- \subsection{Example} \label{sect-func-example}
-
- Many functions are included with the \RLaB\ source distribution.
- Functions can be found in the distribution subdirectories
- \verb+./rlib+, \verb+./toolbox+, and \verb+./examples+. These
- directories are normally installed under \verb|/usr/local/lib/rlab|.
-
- We will continue with some simple examples demonstrating
- function creation and usage. We will carry on with the exercise of
- learning least-squares techniques.
-
- In some earlier examples we played with solving a set of normal
- equations, and tried a simple experiment with Householder
- reflections. Now we want to try out this technique, and decompose a
- matrix into two matrices: $Q$ and $R$; such that $A =
- QR$.\footnote{For an excellent discussion of the $QR$ decomposition
- please refer to ``Matrix Computations'' Golub and Van Loan.}
-
- We are going to decompose an entire matrix, so we will want to
- automate the procedures we used in previous examples. The first was
- creating a Householder vector. Instead of typing in our function at
- the command-line, we will use a text-editor to create the function
- in a file so that we can correct our mistakes without retyping the
- entire function.
-
- \begin{verbatim}
- //
- // house_v(): Given an N-vector V, generate an n-vector V
- // with V[1] = 1, such that (eye(n,n) - 2*(V*V')/(V'*V))*X
- // is zero in all but the 1st component.
- //
-
- static (sign)
-
- house_v = function(v)
- {
- local(v)
-
- n = max( size(v) );
- u = norm(v, "2");
- if(u != 0)
- {
- b = v[1] + sign(v[1])*u;
- if(n > 1)
- {
- v[2:n] = v[2:n]/b;
- }
- }
- v[1] = 1;
- return v;
- };
-
- sign = function ( X )
- {
- if (X >= 0) { return 1; else return -1; }
- }
- \end{verbatim}
-
- Note that our new function is more complicated than our earlier
- ``one-liner''. This is due to the fact that the function is more
- efficient, and does some input-checking. Notice that the variables
- \verb+b+, \verb+n+, \verb+u+, and \verb+v+ are {\em local}; these
- local variables will never be seen by the user, and will not
- interfere with any pre-existing variables by the same name in the
- global-workspace.
-
- Also note that the function argument, \verb+v+ is copied to the
- function local variable \verb+v+. This prevents the function from
- changing the values in the input argument, and thus destroying the
- contents of the caller's variable.
-
- One other important feature of the new function is the usage of
- the \verb+sign+ function. \verb+house_v+ requires that the sign
- function return either $1$ or $-1$. The \RLaB\ built-in \verb+sign+
- function will return zero when its argument is zero; this
- behavior is unacceptable, so we have written our own sign
- function. Declaring our new sign function to be static means that
- it will only affect statements within the file \verb+house_v.r+.
-
- To use our new function type:
-
- \begin{verbatim}
- > a = rand (4,2);
- > x = house_v (a[;1])
- x =
- 1
- 0.434
- 0.042
- 0.412
- \end{verbatim}
-
- Now that we can generate a Householder vector, we need to
- automatically form the Householder reflection, and use it to reduce
- $A$ to upper triangular form.
-
- \begin{verbatim}
- // P.r
- // P: Generate P matrix
-
- P = function ( V )
- {
- m = max( size(V) );
- return [ eye(m,m) - 2*(V*V')./(V'*V) ];
- };
- \end{verbatim}
-
- This function is a small one, and simply implements the formula we
- demonstrated earlier. We can test out our two new functions like so:
-
- \begin{verbatim}
- > ( p1 = P (house_v (a[;1])) ) * a
- -1.49 -1.11
- -4.09e-17 0.0174
- -2.87e-18 0.354
- -8.89e-17 -0.779
- > p1' * p1
- 1 4.79e-17 2.75e-18 1.8e-17
- 4.79e-17 1 -4.78e-18 -2.51e-18
- 2.75e-18 -4.78e-18 1 9e-18
- 1.8e-17 -2.51e-18 9e-18 1
- \end{verbatim}
-
- Our new function seems to be working as expected. The computed
- Householder reflection, \verb+p1+, zeros out all of the elements
- below the first in column one of \verb+a+. Additionally \verb+p1+
- is an orthogonal transformation, as demonstrated by computing
- ${P_{1}}^{T}P_{1}$. It is usually more efficient to build up
- programs as a collection of simple functions, like we are doing
- here, testing each as it is written, and making the appropriate
- fixes.
-
- Function debugging can be easily accomplished by simply removing key
- `\verb+;+' to turn expression printing on. Additionally, one can
- comment out \verb+local+ statements so that a function's variables
- can be examined after function execution.
-
- Now there are two more pieces, a better implementation of \verb+P+
- called \verb+house_row+\footnote{See ``Matrix Computations'' by
- Golub and VanLoan.}, and the final function (\verb+house_qr+) that
- will apply the transformations in sequence to $A$ to produce the
- upper-triangular $R$, and the orthogonal $Q$.
-
- \begin{verbatim}
- //
- // house_row(): Given an MxN matrix A and a non-zero M-vector V
- // with V[1] = 1, the following algorithm overwrites A with
- // P*A, where P = eye(m,m) - 2*(V*V')/(V'*V)
- //
-
- house_row = function(A, v)
- {
- local(A)
-
- b = -2/(v'*v);
- w = b*A'*v;
- A = A + v*w';
- return A;
- };
- \end{verbatim}
-
-
- \begin{verbatim}
- // house_qr.r
- // Given A, with M >= N, the following function finds Householder
- // matrices H1,...Hn, such that if Q = H1*...Hn, then Q'*A = R is
- // upper triangular.
-
- // House.qr returns a list containing `q', and `r'
-
- rfile house_row
- rfile house_v
- rfile P
-
- house_qr = function ( A )
- {
- local (A)
-
- m = A.nr; n = A.nc;
- v = zeros(m,1);
- q = eye (m, m);
-
- for(j in 1:n)
- {
- // Generate the Householder vector
- v[j:m] = house_v( A[j:m;j] );
-
- // Apply the Householder reflector to A
- A[j:m;j:n] = house_row( A[j:m;j:n], v[j:m] );
-
- // Create Q
- if(j < m)
- {
- q = P ([ zeros (j-1,1); 1; v[j+1:m] ]) * q;
- }
- }
- return << q = q'; r = A >>;
- };
- \end{verbatim}
-
- Notice the three \verb+rfile+ statements near the top of the file.
- These statements ensure that the user-function dependencies are
- resolved {\em before} we try and execute the function. Also note
- how \verb+house_qr+ returns two matrices in a list, with element
- names \verb+q+, and \verb+r+. We can use, and test, this new
- function like:
-
- \begin{verbatim}
- > x = house_qr ( a )
- q r
- > x.q * x.r
- 0.7 0.96
- 0.95 0.915
- 0.0918 0.441
- 0.902 0.0735
- > a
- a =
- 0.7 0.96
- 0.95 0.915
- 0.0918 0.441
- 0.902 0.0735
- \end{verbatim}
-
- A visual comparison shows that our function does indeed work.
- Now we wish to use this factorization to compute a solution to our
- original least-squares problem. Since we have decomposed $A$ into
- two matrices, one of which is upper triangular, we can reformulate
- the problem as a simple back-substitution. The \RLaB\ built-in
- function \verb+solve+ will do this for us, since \verb+sr+ is
- already upper-triangular, all \verb+solve+ will do is the
- back-substitution.
-
- \begin{verbatim}
- > a = [3,4,1;0,2,2;0,0,7;zeros(2,3)];
- > b = [14;10;21;6;2];
- > x = house_qr (a);
- > sq = x.q[;1:3];
- > sr = x.r[1:3;];
- > z = b'*sq;
- > sol = solve (sr, z')
- sol =
- 1
- 2
- 3
- > b - a*sol
- 0
- 0
- 0
- 6
- 2
- \end{verbatim}
-
- Now that we have built our own \verb+qr()+ I should tell you that
- \RLaB\ has a built-in \verb+qr()+ that is much more robust, and
- significantly faster.
-
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
- \section{Objects---Other Data Structures}
-
- Although \RLaB\ is primarily a linear-algebra programming tool,
- other data structures are necessary to allow the user some
- flexibility, and a little extensibility. The two remaining data
- structures do just that. Strings allow users/programmers to write
- intelligible error messages, and properly annotate program inputs
- and outputs, as well as label quantities during program execution.
- The list object is a very flexible data structure that can hold
- numeric, string, function and other list objects. Since lists are
- indexed in an associative fashion, they are a very powerful tool.
-
- \subsection{Strings}
-
- When performing numeric computations, strings are not normally used
- for much except error messages and such. However, there are many
- other tasks for which strings are quite useful.
-
- String objects can be treated in a manner similar to numeric
- objects, with the main difference being the different string
- operators. The only numeric operator that works on strings is the
- `\verb-+-' which catenates the left and right string operands
- together.
-
- \begin{verbatim}
- > "first part of the string " + "and the second part of the string"
- first part of the string and the second part of the string
- \end{verbatim}
-
- The other numeric operators will only produce a runtime error
- message when used with strings.
-
- \begin{verbatim}
- > "string1" * "string2"
- rlab: NULL, NULL, 1st arg invalid for multiply
- \end{verbatim}
-
- The relational and logical operator do work with string objects.
- For instance, you can compare two strings:
-
- \begin{verbatim}
- > "string-a" == "string-b"
- 0
- \end{verbatim}
-
- Or two string matrices:
-
- \begin{verbatim}
- > ["el-1", "el-2"] == ["el-1", "el-x"]
- 1 0
- \end{verbatim}
-
- Functions exist to aid with string to number conversions
- (\verb+num2str+), and reading strings from the standard input
- (\verb+input+).
-
- \begin{verbatim}
- > x = input ("input a string > ", "s")
- input a string > teststring
- teststring
- \end{verbatim}
-
- The function \verb+strsplt+ will split an arbitrary string into a
- matrix of one-character strings. This allows the user to operate on
- individual characters in a string; the `\verb-+-' operator can be
- used to ``glue'' the desired pieces back together again.
-
- \begin{verbatim}
- > x = "this is a single string";
- > strsplt (x)
- t h i s i s a s i n g l e s t r i n g
- \end{verbatim}
-
- We will do a little more with strings in Section~\ref{sect-lists}.
-
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
- \subsection{Lists} \label{sect-lists}
-
- A list is a heterogeneous associative array. Simply, a list is an
- array whose elements can be from different classes. Thus a list can
- contain numeric, string, function, and other list objects. Lists
- have many uses, only some of which we will demonstrate herein.
-
- To create a list-object use the `\verb+<<+' and `\verb+>>'+'
- operators. The list will be created, and the objects inside the
- `\verb+<< >>+' will be copied into the new list. If the objects are
- not renamed during the list-creation, they will be given numerical
- index values.
-
- \begin{verbatim}
- > a = rand(3,4); b = sqrt (a); c = 2*a + b;
- > ll = << a ; b ; c >>
- 1 2 3
- > ll2 = << A = a; b = b ; x = c >>
- A b x
- > ll2.A == ll.[1]
- 1 1 1 1
- 1 1 1 1
- 1 1 1 1
- \end{verbatim}
-
- Lists are not indexed in what is perceived as the ``traditional
- manner''. Instead the list index is converted to a string, and the
- string value is used to look-up the referenced
- object\footnote{\RLaB\ lists are similar to AWK associative
- arrays.}. There are two methods for referencing the elements of a
- list, the first, a shorthand notation looks like:
-
- \begin{quote}
- list\_name . element\_name
- \end{quote}
-
- In this case, the {\em list\_name} and {\em element\_name} must
- follow the same rules as ordinary variable names. The second
- method for indexing a list is:
-
- \begin{quote}
- list\_name . \verb+[+ numeric\_or\_string\_expression \verb+]+
- \end{quote}
-
- The second method allows string and numeric variables to be
- evaluated before doing the conversion to string type\footnote{If one
- is necessary.}.
-
- As you have seen in an earlier example lists can be used within
- functions when it is necessary to return several values. Because of
- the lists flexible nature a function can return matrices of
- differing sizes and types, as well as strings, other lists, or
- user-functions.
-
- \subsubsection{Examples}
-
- The \verb+getline+ function reads from a designated file, or pipe,
- and separates the input into whitespace separated tokens. The
- tokens are either numbers or strings. In this example we will use
- the \verb+getline+ function, and \RLaB\ piping capability to read
- the output from the UNIX ps command, and sum the numbers in the 5th
- column (the resident process size).
-
- \begin{verbatim}
- > psize = 0;
- > while (length (ans = getline ("|/usr/ucb/ps -aux | grep ian")))
- {
- psize = psize + ans.[5];
- }
- > close ("|/usr/ucb/ps -aux | grep ian");
- > psize
- psize =
- 2.26e+03
- \end{verbatim}
-
- The following simple example makes extensive use of the list
- object's capabilities. This example consists of two user-functions
- that were written to allow someone to index a matrix with strings,
- or numeric quantities that are not necessarily equal to the integer
- row and column numbers.
-
- Two special qualities of lists are used in this example. The first
- is the ability to group together related objects; thus the matrix,
- and its row and column labels are copied into a list-object. The
- second special quality is the associative nature of the list
- indices. When constructing the row and column labels, we create two
- lists that are members of the top-level list. These sub-lists
- contain the row or column label as the index value, and the integer
- row or column number as data.
-
- \begin{verbatim}
- //
- // Create a list-object, a matrix with row and
- // column labels. Then the matrix can be indexed
- // with the labels by using lb().
- //
-
- mklb = function (mat, rl, cl)
- {
- lrl = <<>>; lcl = <<>>;
- if (!exist (rl))
- {
- rl = 1:mat.nr;
- else
- if (length (rl) != mat.nr) { error ("mklb: rl wrong size"); }
- }
-
- for (i in 1:rl.n)
- {
- lrl.[rl[i]] = i;
- }
-
- if (!exist (cl))
- {
- lcl = 1:mat.nc;
- else
- if (length (cl) != mat.nc) { error ("mklb: cl wrong size"); }
- }
-
- for (i in 1:cl.n)
- {
- lcl.[cl[i]] = i;
- }
-
- return << m = mat; rl = lrl; cl = lcl >>
- };
- \end{verbatim}
-
- the function \verb+mklb+ creates a list containing matrix, row,
- and column labels. Looking closely at the for-loops you will notice
- that the labels values are actually the index values of the
- lists \verb+lrl+ and \verb+lcl+. This method is used since it
- provides extremely easy access to the matrix elements in the next
- function \verb+lb+.
-
- \begin{verbatim}
- lb = function ( mlb, rl, cl )
- {
- // Create row indices
-
- if (!exist (rl))
- {
- irl = 1:mlb.m.nr; // use all the rows
- else
- for (i in 1:rl.n)
- {
- irl[i] = mlb.rl.[rl[i]];
- }
- }
-
- // Create column indices
-
- if (!exist (cl))
- {
- icl = 1:mlb.m.nc; // use all the columns
- else
- for (i in 1:cl.n)
- {
- icl[i] = mlb.cl.[cl[i]];
- }
- }
-
- return mlb.m[irl; icl]
- };
- \end{verbatim}
-
- The for-loops in \verb+lb+ simply loop through the specified
- indices, using them as index values to the internal row and column
- lists. Once the numeric vectors \verb+irl+ and \verb+icl+ have been
- formed the specified matrix elements are easily returned.
-
- To use the new functions you might:
-
- \begin{verbatim}
- > m = [1,2,3;4,5,6;7,8,9];
- > ml = mklb (m, ["r1","r2","r3"], ["c1","c2","c3"])
- cl m rl
- > lb (ml, ["r1","r3"])
- 1 2 3
- 7 8 9
- > lb (ml, ["r1","r3"], "c1")
- 1
- 7
- > lb (ml, , "c2")
- 2
- 5
- 8
- \end{verbatim}
-
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
- \section{Builtin functions}
-
- \RLaB\ comes with many built-in and user-functions. The built-in
- functions are available any time \rlab\ is run, regardless of the
- command-line options. The user-functions that are delivered with
- \RLaB\ may, or may not be accessible, depending upon how \rlab\ has
- been configured on your computer and the command-line options used.
-
- Typing `\verb+rlab -ql+' will run \rlab\ without executing the
- \verb+.rlab+ file or loading any of the delivered user-functions.
- The built-in functions in \RLaB\ are unlike user-functions in that
- users cannot destroy or reassign them to other
- variables\footnote{The exception to this statement is the use of
- static variables, which can obscure built-in functions - see the
- Section~\ref{sect-func-example}.}. This protection is in place
- so that users will be able to write portable libraries using the
- built-in functions.
-
- \RLaB\ does {\em not} automatically search \verb+RLAB_SEARCH_PATH+
- for R-files when an unresolved reference is encountered. Instead,
- the user must explicitly \verb+load+, or use the \verb+rfile+
- command to get \RLaB\ to load and compile the function or
- statements. To see what functions are currently available type:
- `\verb+what()+', this will list all of the currently available
- functions. Typing `\verb+rfile+' from within \rlab\ will list all
- of the R-files in the directories listed in the environment
- variable \verb+RLAB_SEARCH_PATH+. The files displayed by the
- \verb+rfile+ command can be loaded by typing `\verb+rfile filename+',
- where \verb+filename+ is the name of the R-file to load,
- {\em without} the \verb+.r+ extension.
-
- \subsection{Function Behavior}
-
- Many of the delivered functions fall into one of three categories:
- scalar-functions, vector-functions, or matrix-functions. The list
- below gives examples from each type of function, but is not
- all-inclusive.
-
- \begin{description}
-
- \item[Scalar Functions:] These functions operate on scalars, and
- treat matrices in an element-by-element fashion. Some
- examples are:
-
- \begin{tabbing}
- function1 \= function2 \= function2 \= function4 \kill
- abs \> exp \> floor \> round \\
- cos \> sin \> tan \> ceil \\
- sqrt \> real \> imag \> conj \\
- isnan \> int \> \> \\
- \end{tabbing}
-
- \item[Vector Functions:] These functions operate on vectors,
- either row-vectors (1-by-$n$) or column vectors ($m$-by-1),
- in the same fashion. If the argument is a matrix with $m
- \geq 1$ then the operation is performed in a column-wise
- fashion. Some examples are:
-
- \begin{tabbing}
- function1 \= function2 \= function2 \= function4 \kill
- sum \> cumsum \> prod \> cumprod \\
- mean \> max \> min \> fft \\
- sort \> any \> all \> ifft \\
- \end{tabbing}
-
- When using a vector oriented function, like \verb+max()+ it
- is possible to operate on matrix objects. For example the
- maximum value in a matrix can be obtained via
- \verb+max (max (a))+. The first call to \verb+max()+
- returns a vector of the maximum values from each column,
- and the second call to \verb+max()+ returns the maximum
- value in the matrix.
-
- \item[Matrix Functions:] These functions operate on matrices as a
- single entity. Some examples are:
-
- \begin{tabbing}
- function1 \= function2 \= function2 \= function4 \kill
- balance \> chol \> det \> eig \\
- hess \> inv \> lu \> norm \\
- pinv \> qr \> rank \> rcond \\
- reshape \> solve \> svd \> symm \\
- factor \> backsub \> issymm \\
- \end{tabbing}
-
- \item[Misc. Functions:] These functions are in this particular
- category simply because they don't fit anywhere else. Some
- examples are:
-
- \begin{tabbing}
- function1 \= function2 \= function2 \= function4 \kill
- system \> getline \> show \> who \\
- what \> tic \> toc \> printf \\
- format \> write \> read \> readm \\
- \end{tabbing}
-
- \end{description}
-
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
- \section{Input and Output}
-
- There are two types if I/O in \RLaB\ .
-
- \begin{enumerate}
- \item Raw data, such as matrices, lists, and strings. In this case
- the formatting is irrelevant.
- \item Formatted I/O, such as data from other programs, and
- formatted output intended for reports and such.
- \end{enumerate}
-
- In either case file names, or file-handles, are the same. A
- file-handle is {\em always} a string, either a string constant, a
- string variable, or a string expression. For example:
-
- \begin{verbatim}
- > write ("file.rd", A);
-
- > f = "file.rd"; write (f, A);
-
- > write ("file" + ".rd", A);
- \end{verbatim}
-
- are all equivalent.
-
- There are three special file-handles in \RLaB\ ; they are:
- \verb+"stdin"+, \verb+"stdout"+, and \verb+"stderr"+.
-
- \verb+"stdin"+ is connected to \RLaB's standard input, usually the
- keyboard. \verb+"stdout"+ is connected to \RLaB's standard output,
- usually the screen. And \verb+"stderr"+ is connected to the
- standard error, again, usually the screen.
-
- Files are automatically opened by the functions that perform input
- or output. In most cases the files will automatically be closed
- after the function has completed its task. The following will
- force a file closure after their task is complete: \verb+rfile+,
- \verb+load+, \verb+read+, and \verb+readm+.
-
- However, \verb+write+, \verb+writem+, \verb+fprintf+, and
- \verb+getline+ will leave their files open after completion, so
- that they may be used subsequently without complicated file
- positioning operations.
-
- \RLaB\ has another special type of file-handle. When a string,
- starting with a `\verb+|+' is used as a file-handle, a process is
- created. Either the sub-process input, or output is connected to
- \RLaB\ through the file-handle. For example:
-
- \begin{verbatim}
- > output = "| sort";
- > for (i in 5:1:-1) { fprintf (output, "%i\n", i); } close (output);
- 1
- 2
- 3
- 4
- 5
- \end{verbatim}
-
- If the \verb+fprintf+ output were not sent to the Unix program
- \verb+sort+, you would expect the output to appear in descending
- order. In fact, \verb+fprintf+ does write the output in descending
- order, to \verb+sort+. Then, \verb+sort+ re-orders its input, and
- writes it to \verb+stdout+. The same trick works in reverse;
- functions that expect input can get it from a sub-process. A good
- example is \verb+getline+:
-
- \begin{verbatim}
- > input = "| ls -la *.[ch]";
- > fsum = 0;
- > while (length (ans = getline (input))) { fsum = fsum + ans.[5]; } fsum
- fsum =
- 943083
- > close (input);
- \end{verbatim}
-
- In this instance we used the sub-process capability to determine
- the number of bytes of C source code, and header files exist in the
- current working directory. The sub-process performs the long
- listing, and getline parses this input into numbers and strings.
- The $5^{th}$ column of the \verb+ls -la+ output is the number of
- bytes in each file.
-
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
- \section{Plotting}
-
- There are two available methods for plotting data from within
- \rlab. Probably the most desirable is the usage of the builtin
- plotting library, Plplot. The second method involves the usage of
- \rlab's I/O abilities (piping) to send data and commands to another
- running process - Gnuplot, for example. A fairly extensive
- example of this second method is provided in the \rlab source
- distribution in the file \verb+misc/gnu_plot.r+. We shall focus
- on the builtin plotting capability.
-
- There are two new terms you must learn to understand plotting -
- plot-window, and sub-plot. The plot window is manifested on the
- plot-device, such as a Tektronix screen, X-window display, or a
- printer. \rlab will allow you to have multiple plot-windows, if
- your display device will support it. X-windows supports multiple
- plot-windows, but a Tektronix display, or DOS display will not.
-
- The next term is sub-plot. Each plot-window can have 1 or more
- sub-plots. The layout of the sub-plots is determined when
- \verb+pstart+ is called.
-
- Regardless of the number of plot-windows and sub-plots, there can
- only be one {\em current} plot-window, and one {\em current}
- sub-plot within the current plot-window. Each plot related function
- will only work on the current sub-plot in the current plot-window.
- This way the majority of the plot functions are the same,
- regardless of the output device. The current sub-plot is always the
- {\em next} plot. As soon as a plot function is used that actually
- draws the plot on the plot-device, such as \verb+plot+,
- \verb+plot3+ or \verb+plhist+, the current sub-plot is incremented.
- Therefore, all functions that effect the appearance of a plot must
- be used before the plot is drawn.
-
- \subsection{2-D Plotting}
-
- To plot some data with a minimum of effort do:
-
- \begin{verbatim}
- > data = (0:pi:.1)';
- > data[;2] = cos (2*pi*data*3);
- > pstart (,,"xwin");
- > plot (data);
- \end{verbatim}
-
- The \verb+pstart+ function was called with the default sub-plot
- definition (1 subplot), and the X-windows driver as the display
- device. The \verb+plot+ function accepts matrices, or lists as
- arguments and plots the columns of a matrix, or the columns of each
- matrix of a list.
-
- Now for a slightly more complex example.
-
- \begin{verbatim}
- > t = (0:10:.05)';
- > x = exp (-0.5*t) .* (cos (2*pi*3*t) + sin (2*pi*7*t));
- > X = fft (x);
- > rfile faxis
- > freq = faxis (X, .05, 3);
- > mag = abs (X);
- > rfile angle
- > phase = angle (X);
- > pstart (1,2,"xwin");
- >
- > ptitle ("Magnitude of FFT")
- > xlabel ("Frequency (Hertz)");
- > plot ([freq,mag]);
- >
- > ptitle ("Angle (atan2(imag/real)) of FFT")
- > xlabel ("Frequency (Hertz)");
- > ylabel ("Angle (radians)");
- > plot ([freq,phase]);
- > plprint ("p3.ps");
- \end{verbatim}
-
- \vskip 1cm
-
- \begin{figure}[htbp]
- \begin{picture}(350,350)(0,50) % (x-size, y-size) (x-shift, y-shift)
- \special{psfile=p3.ps
- angle=90 hscale=60 vscale=60 voffset=40 hoffset=460}
- \end{picture}
- \caption{Example Plot \label{p1}}
- \end{figure}
-
- In this example we create a plot-window with two subplots so that
- we can display related information on the same plot-window. The
- arguments to \verb+pstart+ specify that there will be 1 plot in the
- horizontal direction, and 2 plots in the vertical direction, thus
- creating 2 sub-plots. The first \verb+ptitle+ and \verb+xlabel+
- function calls effect the first sub-plot. The first call to
- \verb+plot+ creates the first sub-plot. The subsequent calls to
- \verb+ptitle+, \verb+xlabel+ and \verb+ylabel+ effect the second
- sub-plot, and the last call to \verb+plot+ creates the second
- sub-plot.
-
- The last line is a call to \verb+plprint+. The \verb+plprint+
- function creates a file that contains a copy of the contents of the
- current plot-window. The default hardcopy device for \verb+plprint+
- is Postscript, but color Postscipt, Xfig, plmeta, and HP-LJII can
- also be specified. The output from \verb+plprint+ is presented in
- Figure~\ref{p1}.
-
- \subsection{Histograms}
-
- Histograms can be plotted quite easily. At present the histogram
- plotting function, \verb+plhist+, will plot histograms of the
- columns of a matrix. For example:
-
- \begin{verbatim}
- > // Create data
- > rand("normal", 0, pi);
- > r = rand(2000,1);
- >
- > // Create plot
- > ptitle("Histogram, 30 Bins");
- > plhist (r, 30);
- \end{verbatim}
-
- \begin{figure}[htbp]
- \begin{picture}(350,300)(0,50) % (x-size, y-size) (x-shift, y-shift)
- \special{psfile=p5.ps
- angle=90 hscale=60 vscale=60 voffset=40 hoffset=460}
- \end{picture}
- \caption{Example Histogram Plot \label{p5}}
- \end{figure}
-
- Figure~\ref{p5} contains the Postscript output from the previous
- example.
-
- \subsection{3-D Plotting}
-
- Plotting 3-dimensional data is quite straightforward, and very
- similar to the steps used for plotting 2-dimensional data. We will
- begin with an example:
-
- \begin{verbatim}
- > // Create the data
- > X = -2:2:.2;
- > Y = X;
- > Z = [];
- > for (i in 1:X.n) {
- > for (j in 1:Y.n) {
- > Z[i;j] = X[i] * exp (-X[i]^2 - Y[j]^2);
- > }
- > }
- > // Make the plot
- > pstart(,,"xwin");
- > plwid(4);
- > ptitle("Sample 3-D Plot");
- > xlabel("X-Axis");
- > ylabel("Y-Axis");
- > zlabel("Z-Axis");
- > plmesh( << x = X; y = Y; z = Z >> );
- > plprint("3d.ps");
- \end{verbatim}
-
- \begin{figure}[htbp]
- \begin{picture}(300,350)(0,120) % (x-size, y-size) (x-shift, y-shift)
- \special{psfile=3d.ps
- angle=90 hscale=80 vscale=80 voffset=40 hoffset=530}
- \end{picture}
- \caption{Example 3D Plot \label{p3d}}
- \end{figure}
-
- The output from the plprint command appears in
- Figure~\ref{p3d}. Now we must take a minute and explain the data
- passed as input to \verb+plot3+. Three dimensional plots have two
- independent variables (vectors), \verb+x+, and \verb+y+. The
- dependent variable \verb+z+ (a matrix) is a function of both
- \verb+x+ and \verb+y+ and has row dimension the length of \verb+x+
- and column dimension the length \verb+y+. This storage scheme for
- three-dimensional data is economical in terms of memory, and allows
- the user some extra flexibility. Thus, the argument to \verb+plot3+
- is a list with three elements: \verb+x+, \verb+y+, and
- \verb+z+. \verb+plot3+ can accept up to three distinct lists for
- plotting.
-
- The same plot-functions: \verb+ptitle+, \verb+xlabel+, and
- \verb+ylabel+ can be used with 3-dimensional plots. Additionally,
- \verb+zlabel+ can be used to add labels to the \verb+z+ axis.
-
- The next example (Figure~\ref{p6}) demonstrates more plotting
- capabilities - including: changing fonts and pen widths, multiple
- plots per page and annotating a plot. Note that the calls to
- \verb+plptex+ are made {\em after} the \verb+plot+ calls. since
- \verb+plptex+ uses the plot coordinates to place text on the graph,
- the plot must be created first.
-
- \begin{verbatim}
- //
- // Demonstrate the effect of adding terms to a Fourier expansion
- //
-
- // We want to approximate a square wave...
- // The Fourier Series for a square wave is a
- // sum of odd harmonics - we will demonstrate.
- // Start up a plot window...
-
- pstart(2,2, "xwin");
-
- // Compute the 1st term in the Fourier series and plot.
-
- t = (0:10:.1)';
- y = sin (t);
-
- ptitle ("Fundamental Frequency");
- plwid(10);
- plfont(1);
- plot ( [t,y] );
- plptex ("Pen width = 10", 4, 0.4);
- plptex ("Font = 1 (Normal)", 4, 0.1);
- pause ();
-
- // Now add the third harmonic to the fundamental, and plot.
-
- y = sin (t) + sin (3*t)/3;
-
- ptitle ("1st and 3rd Harmonics");
- plwid(7);
- plfont(4);
- plot ( [t,y] );
- plptex ("Pen width = 7", 4, 0.4);
- plptex ("Font = 4 (Script)", 4, 0.1);
- pause ();
-
- // Now use the first, third, fifth, seventh, and ninth harmonics.
-
- y = sin (t) + sin (3*t)/3 + sin (5*t)/5 + sin (7*t)/7 + sin (9*t)/9;
- ptitle ("1st, 3rd, 5th, 7th, 9th Harmonics");
- plwid(4);
- plfont(3);
- plot ( [t,y] );
- plptex ("Pen width = 3", 4, 0.4);
- plptex ("Font = 3 (Italic)", 4, 0.1);
- pause ();
-
- //
- // Now create a matrix with rows that represent adding
- // more and more terms to the series.
- //
-
- t = (0:3.14:.02);
- y = zeros(10,max(size(t)));
- x = zeros(size(t));
-
- for (k in 1:19:2)
- {
- x = x + sin(k*t)/k;
- y[(k+1)/2;] = x;
- }
-
- //
- // Now make a nice 3-D plot that shows the effect
- // of adding more and more terms to the series.
- //
-
- plfont (2);
- plwid(1);
- ptitle ("Square Wave via Fourier Series");
- ylabel ("No. Terms");
- plaz (140);
- plot3 (<< x = t; y=1:10; z=y' >>);
- plptex ("Pen width = 1", -1, 4.5);
- plptex ("Font = 2 (Roman)", -1, 3.8);
- plprint ("p6.ps"); // Make hardcopy (Postscript default).
- \end{verbatim}
-
- \begin{figure}[htbp]
- \begin{picture}(500,450)(0,50) % (x-size, y-size) (x-shift, y-shift)
- \special{psfile=p6.ps
- angle=90 hscale=70 vscale=80 voffset=40 hoffset=500}
- \end{picture}
- \caption{Square Wave Plot Example \label{p6}}
- \end{figure}
-
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
- \clearpage
- \newpage
-
- \section{Summary}
-
- \Rlab\ can do quite a few things that we have not covered here. The
- reference manual or the online help should be consulted for more
- detailed descriptions of language and function behavior. We will
- close out this primer with a listing of the currently available
- function (both built-in and user-functions).
-
- \begin{verbatim}
- > what ()
- abs epsilon log plot solve
- acos error log10 plot3 sort
- acosh eval logspace plprint sprintf
- all exist lu plptex sqrt
- any exp lyap plstyle srand
- asin eye matrix plwid std
- asinh factor max printf strsplt
- atan fft maxi printmat strtod
- atan2 filter mean prod sum
- atanh find members pstart svd
- backsub finite min ptitle sylv
- balance fix mini pwin symm
- cd floor mod qr system
- ceil format nan rand tan
- chol fprintf norm rank tanh
- class fvscope num2str rcond tic
- clear getb ode read tmp_file
- clearall getenv ones readb toc
- close getline open readm trace
- compan hess pause real tril
- complement hilb pclose redit triu
- conj ifft pend replot type
- cos imag plalt reshape union
- cosh inf plaspect round what
- cross input plaxis save who
- cumprod int plaz scalar whos
- cumsum int2str plegend schord write
- det intersection plfont schur writeb
- diag inv plgrid set writem
- diary isempty plgrid3 show xlabel
- diff isinf plhist showpwin ylabel
- disp isnan plhistx sign zeros
- dot issymm plhold sin zlabel
- eig length plhold_off sinh
- eign linspace plimits size
- eigs load plmesh sizeof
- > quit
- \end{verbatim}
-
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- \end{document}
-